package com.csx.governance.traffic.core.interceptor;

import com.csx.governance.traffic.core.context.TrafficRequest;
import com.csx.governance.traffic.core.context.TrafficResponse;

/**
 * @author cuisongxu
 * @date 2023/3/18 10:52
 */
public interface TrafficHandlerInterceptor {

    /**
     * 请求处理前的回调方法，实现外调前的预处理。 返回值表示是否继续流程。
     * @param request 请求对象
     * @param response 响应对象
     * @return true表示继续流程；false表示流程中断，不会调用其它的拦截器或者处理器
     */
    default boolean preHandle(TrafficRequest request, TrafficResponse response) {
        return true;
    }

    /**
     * 请求处理后的回调方法，实现外调的后处理，但在渲染视图之前，此时我们可以通过 modelAndView对模型数据进行处理或者对视图进行处理
     * @param request 请求对象
     * @param response 响应对象
     */
    default void postHandle(TrafficRequest request, TrafficResponse response) {}

    /**
     * 请求处理完毕的回调方法，即在视图渲染完毕.如性能监控我们可以在此处记录结束时间，还可以进行一些资源清理
     * @param request 请求对象
     * @param response 响应对象
     * @param ex 异常
     */
    default void afterCompletion(TrafficRequest request, TrafficResponse response, Throwable ex){};
}
